/**
 * project: finance-manage
 * package: com.example.controllers
 * 逻辑处理 > 账户操作
 */

package com.example.controllers;

import java.sql.ResultSet;
import java.sql.SQLException;

import com.example.util.Constants;
import com.example.util.HashEncryption;
import com.example.util.Debug;
import com.example.dataAccess.UsersDAO;
import com.example.interfaces.AccountControlInterface;
import com.example.models.JsonModel;

public class AccountControl extends Control_Base implements AccountControlInterface {

    /* 数据库用户信息管理类 */
    private UsersDAO userDao = null;

    public AccountControl() {
        super();
        /* 实例化数据库用户信息管理类 */
        userDao = new UsersDAO(connect.getConnection());
    }

    /* 注册新用户 */
    @Override
    public JsonModel register(String username, String password) {
        /* 判定保留用户名 */
        for (String identifier : Constants.identifierList) {
            if (username.equals(identifier)) {
                return getErrno(1005);
            }
        }
        /* 定义JsonModel类，用于返回结果 */
        JsonModel responseJsonModel;
        /* 加密密码 */
        String haString = HashEncryption.hashPassword(password);
        /* 贮存用户信息，并暂存操作结果 */
        try {
            if (!getHashPwd(username).isEmpty()) {
                return getErrno(1001);
            }
            ;
            userDao.insert(username, haString);
        } catch (SQLException e) {
            responseJsonModel = getErrno(-998);
        }
        Debug.print("新用户登记成功");
        /* 创建新用户表 */
        try {
            userDao.createTable(username);
            Debug.print("新用户表创建成功");
            responseJsonModel = getErrno(0);

        } catch (SQLException e) {
            e.printStackTrace();
            responseJsonModel = getErrno(-998);
        }
        return responseJsonModel;
    }

    /* 登录 */
    @Override
    public JsonModel login(String username, String inputPwd) {
        /* 定义JsonModel类，用于返回结果 */
        JsonModel responseJsonModel;
        /* 获取用户密码哈希值 */
        String userPwdHash = getHashPwd(username);
        /* 判断用户是否存在 */
        if (userPwdHash.isEmpty()) {
            Debug.print("用户不存在");
            responseJsonModel = getErrno(1002);
            return responseJsonModel;
        }
        Debug.print(getClass(), ":", inputPwd, userPwdHash);
        /* 验证密码 */
        if (HashEncryption.verifyPassword(inputPwd, userPwdHash)) {
            responseJsonModel = getErrno(0);
            responseJsonModel.push("data", userPwdHash);
        } else {
            responseJsonModel = getErrno(1003);
        }
        return responseJsonModel;
    }

    /* 修改密码 */
    @Override
    public JsonModel changePwd(String username, String pic, String oldPwd, String newPwd) {
        /* cookie验证 */
        if (!verifyUser(username, pic)) {
            return getErrno(1004);
        }
        /* 旧密码验证 */
        JsonModel tryToLogin = login(username, oldPwd);
        if (tryToLogin == getErrno(1003)) {
            return tryToLogin;
        }
        /* 更改密码 */
        try {
            String newPwd_hash = HashEncryption.hashPassword(newPwd);
            userDao.update(username, newPwd_hash);
            return getErrno(0);
        } catch (SQLException e) {
            e.printStackTrace();
            return getErrno(-998);
        }
    }

    /* 获取用户的密码哈希值 */
    @Override
    protected String getHashPwd(String username) {
        String hashPwd = "";
        try {
            /* 查询用户密码哈希值 */
            ResultSet resultSet = userDao.selectHashPwd(username);
            if (resultSet.next()) {
                /* 获取用户密码哈希值 */
                hashPwd = resultSet.getString(1);
            }
            /* 关闭resultSet和Statement对象 */
            resultSet.close();
            userDao.closePreparedStatement();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return hashPwd;
    }

    @Override
    public void close() {
        /* 关闭数据库连接 */
        try {
            userDao.close();
        } catch (SQLException e) {
            e.printStackTrace();
            Debug.print("未知错误， 发生于connection关闭时");
        }
    }
}
